Java-তে modules এবং ModuleLayer Java 9-এ চালু করা হয়েছিল এবং এটি Java Platform Module System (JPMS) এর একটি অংশ। এই নতুন সিস্টেমটি Java SE 9-এর একটি প্রধান ফিচার, যা মডুলার আর্কিটেকচারকে সমর্থন করে এবং বৃহৎ অ্যাপ্লিকেশনগুলির মধ্যে ভালোভাবে পৃথকীকৃত কম্পোনেন্ট তৈরি এবং ব্যবস্থাপনার সুযোগ প্রদান করে। মডিউল সিস্টেমের মাধ্যমে কোডের dependency management, encapsulation, এবং scalability সহজ হয়।
Module এবং ModuleLayer
1. Module:
Module হলো Java-তে একটি নতুন ইউনিট বা সিস্টেমের অংশ, যা কিছু packages এবং তাদের মধ্যে সম্পর্কিত কোডের গ্রুপ। মডিউলগুলি নির্দিষ্ট কোডের অংশগুলিকে পৃথক করে, এবং আপনি একটি মডিউলের নির্দিষ্ট public API অ্যাক্সেস করতে পারবেন। এটি কোডের encapsulation এবং reusability উন্নত করতে সাহায্য করে।
মডিউলটি module-info.java ফাইলের মাধ্যমে সংজ্ঞায়িত করা হয়, যা একটি মডিউলের নির্ভরতা এবং উপলব্ধ প্যাকেজগুলি ঘোষণা করে।
Module এর মূল বৈশিষ্ট্য:
- Encapsulation: একটি মডিউলের অভ্যন্তরীণ কোডটি শুধুমাত্র সেই মডিউলের জন্য দৃশ্যমান এবং এটি বাহিরের কোডের দ্বারা অ্যাক্সেসযোগ্য নয়।
- Dependency Management: একটি মডিউল নির্দিষ্ট মডিউলের উপর নির্ভরশীল থাকতে পারে, এবং এই নির্ভরতাগুলি
module-info.javaফাইলে স্পষ্টভাবে উল্লেখ করা হয়। - Access Control: মডিউলগুলোর মধ্যে
exportsএবংrequiresনির্দেশক দিয়ে অ্যাক্সেস কন্ট্রোল করা হয়।
Module Definition:
// module-info.java
module com.example.module {
// Define which packages are accessible to other modules
exports com.example.module.api;
// Define dependencies on other modules
requires java.base; // This is implicit, as it's always required
requires java.logging;
}
Explanation:
exports: অন্য মডিউলগুলোকে এই প্যাকেজগুলো অ্যাক্সেস করার অনুমতি দেয়।requires: এই মডিউলটি অন্য মডিউলটির উপর নির্ভরশীল।
2. ModuleLayer:
ModuleLayer হল JPMS-এর একটি কনসেপ্ট যা modules এর লোডিং এবং ইন্টারঅ্যাকশনকে ম্যানেজ করে। এটি একটি মডিউল লেয়ার যা নির্দিষ্ট একটি সময়কালে লোড করা মডিউলগুলির একটি গ্রুপের প্রতিনিধিত্ব করে। এটি মডিউল লোড করার এবং তাদের মধ্যে সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়।
ModuleLayer এর ব্যবহার:
- Module Layering: একটি মডিউল লেয়ার হলো মডিউলগুলির একটি হায়ারার্কি, যেখানে মডিউলগুলি নির্দিষ্টভাবে একে অপরের সাথে যুক্ত থাকে।
- Module Loading: মডিউল লোড এবং ইনস্ট্যানশিয়েট করার জন্য
ModuleLayerব্যবহৃত হয়। - Runtime Configuration:
ModuleLayerআপনাকে একটি runtime environment তৈরি করতে দেয়, যেখানে আপনি আপনার নির্দিষ্ট মডিউলগুলি লোড এবং ম্যানেজ করতে পারেন।
ModuleLayer এর উদাহরণ:
import java.lang.module.ModuleLayer;
public class ModuleLayerExample {
public static void main(String[] args) {
// Getting the system module layer
ModuleLayer systemLayer = ModuleLayer.boot();
// Print all modules in the system layer
systemLayer.modules().forEach(module -> System.out.println(module.getName()));
}
}
Explanation:
- এখানে
ModuleLayer.boot()মেথড ব্যবহার করা হয়েছে, যা Java Platform Module System (JPMS) এর boot layer-এ থাকা সমস্ত মডিউলগুলো রিটার্ন করে। modules()মেথডটি সমস্ত মডিউলগুলি ফেরত দেয় যা লোড করা হয়েছে এবং তারপর সেগুলি প্রিন্ট করা হয়।
ModuleLayer এর সাহায্যে কাস্টম মডিউল লোডিং:
এছাড়া, আপনি কাস্টম মডিউল লোড করতে এবং সেটির ম্যানেজমেন্ট করতে ModuleLayer ব্যবহার করতে পারেন।
import java.lang.module.ModuleFinder;
import java.lang.module.ModuleLayer;
import java.nio.file.Paths;
public class CustomModuleLayer {
public static void main(String[] args) {
// Define a custom module path
ModuleFinder finder = ModuleFinder.of(Paths.get("path/to/modules"));
// Create a custom module layer
ModuleLayer.Controller controller = ModuleLayer.defineModules()
.addModuleFinder(finder)
.build();
// Print all modules in the custom layer
controller.layer().modules().forEach(module -> System.out.println(module.getName()));
}
}
Module এবং ModuleLayer এর মধ্যে সম্পর্ক:
- Module: একে একে একটি নির্দিষ্ট কোড বা প্যাকেজের গ্রুপ যা মডুলার আর্কিটেকচার তৈরি করতে সাহায্য করে। মডিউল একটি
module-info.javaফাইলে ডিফাইন করা হয় এবং নির্দিষ্ট কোড অ্যাক্সেস ও ডিপেনডেন্সি কন্ট্রোল করে। - ModuleLayer: এটি JPMS এর একটি অংশ যা মডিউলগুলির হায়ারার্কি এবং লোডিং পরিচালনা করে। এটি runtime-এ মডিউলগুলির লোডিং এবং অ্যাক্সেস কন্ট্রোল করে।
Advantages of Modules:
- Modularity: কোডের মডুলারাইজেশন সহজ করে, এবং ডিপেনডেন্সি এবং অ্যাক্সেস কন্ট্রোল স্পষ্ট করে।
- Encapsulation: মডিউলগুলি কোডের অভ্যন্তরীণ ডেটা এবং মেথড গুলো নিরাপদ রাখতে সাহায্য করে, কারণ শুধুমাত্র public প্যাকেজই অন্য মডিউল দ্বারা অ্যাক্সেসযোগ্য থাকে।
- Separation of Concerns: কোডের মধ্যে নির্দিষ্ট ফাংশনালিটি পৃথকীকরণের মাধ্যমে উন্নত পারফরম্যান্স এবং রক্ষণাবেক্ষণ সুবিধা পাওয়া যায়।
- Improved Dependency Management: মডিউল ডিপেনডেন্সি explicit ভাবে ম্যানেজ করা হয়, যা ডিপেনডেন্সি issues দূর করতে সহায়তা করে।
Modules এবং ModuleLayer Java 9-এ প্রবর্তিত একটি শক্তিশালী ফিচার যা অ্যাপ্লিকেশনের আর্কিটেকচারকে মডুলার এবং সুসংগঠিত করে তোলে। Module ক্লাসটি কোডের সঠিক পৃথকীকরণ এবং নির্ভরতা ম্যানেজমেন্টের জন্য ব্যবহৃত হয়, এবং ModuleLayer ক্লাসটি runtime-এ মডিউল লোড এবং সেগুলির মধ্যে সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়। এটি বড় সিস্টেমের জন্য সুবিধাজনক এবং উন্নত কোড রক্ষণাবেক্ষণের জন্য একটি ভালো পদ্ধতি প্রদান করে।
Java 9-এ মডিউল সিস্টেম (এটি Jigsaw Project নামে পরিচিত) প্রবর্তন করা হয়, যা Java প্ল্যাটফর্মের জন্য একটি নতুন এবং গুরুত্বপূর্ণ বৈশিষ্ট্য। Jigsaw প্রজেক্টের উদ্দেশ্য ছিল Java প্ল্যাটফর্মের মডুলার নির্মাণ, যা কেবল Java অ্যাপ্লিকেশনের আর্কিটেকচার এবং ডিপেনডেন্সি ম্যানেজমেন্টের উন্নতি করতে সহায়তা করে না, বরং পারফরম্যান্স এবং নিরাপত্তা উন্নত করারও সুযোগ প্রদান করে।
Jigsaw Project (Java 9 মডিউল সিস্টেম)
Jigsaw Project হলো Java 9-এ Java SE প্ল্যাটফর্মের জন্য একটি নতুন মডুলার আর্কিটেকচার তৈরি করার উদ্যোগ। এটি Java প্ল্যাটফর্ম এবং Java অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য একটি নতুন কাঠামো তৈরি করে, যেখানে কোডকে ছোট ছোট মডিউলে ভাগ করা হয়, যাতে প্রতিটি মডিউল নির্দিষ্ট কাজ করে এবং সহজে বজায় রাখা যায়। এর মাধ্যমে আপনি নির্দিষ্ট মডিউলগুলির উপর কাজ করতে পারবেন, তাদের মধ্যে সম্পর্ক স্থাপন করবেন এবং মডিউলগুলির মধ্যে নির্ভরতা ঠিকভাবে ম্যানেজ করবেন।
Java 9 মডিউল সিস্টেমের উদ্দেশ্য:
- মডিউলার কোড ডেভেলপমেন্ট:
- Java-তে মডিউলার কোড ডেভেলপমেন্টের মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণ সহজ হয়। কোড মডিউল আকারে বিভক্ত করা হয় যাতে একটি নির্দিষ্ট অংশে পরিবর্তন আনার ফলে অন্য অংশে সমস্যা না হয়।
- ক্লাসপাথ সমস্যা সমাধান:
- Java 9 এর মডিউল সিস্টেমের মাধ্যমে ক্লাসপাথ সমস্যা সমাধান করা হয়, যেমন ক্লাসপাথের জটিলতা, লাইব্রেরি কনফ্লিক্ট ইত্যাদি। মডিউল সিস্টেমের মাধ্যমে প্রতিটি মডিউলের স্পষ্ট নির্দিষ্টতা থাকে এবং আপনি কেবল প্রয়োজনীয় মডিউল ব্যবহার করতে পারেন।
- পারফরম্যান্স এবং নিরাপত্তা:
- মডিউল সিস্টেম Java অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সহায়তা করে, কারণ এটি অব্যবহৃত কোডকে মুছে ফেলতে এবং শুধুমাত্র প্রয়োজনীয় মডিউল লোড করতে সহায়তা করে। একইভাবে, এটি নিরাপত্তা বৃদ্ধিতেও সহায়ক, কারণ আপনি নির্দিষ্ট মডিউলগুলোর মধ্যে সীমিত অ্যাক্সেস প্রদান করতে পারেন।
- ডিপেনডেন্সি ম্যানেজমেন্ট:
- মডিউল সিস্টেমে ডিপেনডেন্সি ম্যানেজমেন্ট সহজ এবং নির্ভুল। আপনি স্পষ্টভাবে ঘোষণা করতে পারবেন কোন মডিউলটি কোন মডিউলের উপর নির্ভরশীল এবং কোন মডিউলটি কী কিছু রপ্তানি করবে।
Java 9 মডিউল সিস্টেমের মূল ধারণা:
- Modules:
- একটি মডিউল হল একটি সংকলিত কোডের সমষ্টি যা নির্দিষ্ট ফাংশনালিটি বা পরিষেবা সরবরাহ করে। প্রতিটি মডিউল একটি module descriptor নামক ফাইলের মাধ্যমে তার তথ্য এবং নির্ভরতাগুলি ঘোষণা করে। এই ফাইলটি সাধারণত
module-info.javaনামে পরিচিত।
- একটি মডিউল হল একটি সংকলিত কোডের সমষ্টি যা নির্দিষ্ট ফাংশনালিটি বা পরিষেবা সরবরাহ করে। প্রতিটি মডিউল একটি module descriptor নামক ফাইলের মাধ্যমে তার তথ্য এবং নির্ভরতাগুলি ঘোষণা করে। এই ফাইলটি সাধারণত
module-info.java:
- এটি প্রতিটি মডিউলের বেসিক তথ্য ধারণ করে, যেমন:
- module name: মডিউলের নাম।
- exports: কোন প্যাকেজ বা ক্লাস মডিউলের বাইরের ব্যবহারকারীদের জন্য উপলব্ধ।
- requires: কোন মডিউলগুলোর উপর নির্ভরশীলতা।
- uses এবং provides: সার্ভিস মেকানিজমের মাধ্যমে নির্দিষ্ট সার্ভিসের জন্য ঘোষণা।
Example:
module mymodule { requires java.base; // It depends on java.base module exports com.example; // It exports the com.example package }- এটি প্রতিটি মডিউলের বেসিক তথ্য ধারণ করে, যেমন:
- Modular JARs:
- Java 9 মডিউল সিস্টেমের একটি বড় সুবিধা হল আপনি JAR ফাইলগুলোকেও মডিউলে রূপান্তর করতে পারেন। একে modular JARs বলা হয়, যা ক্লাসপাথের পরিবর্তে মডিউল সিস্টেমে ব্যবহৃত হয়।
- Module Dependencies:
- মডিউলগুলির মধ্যে নির্ভরতাগুলি স্পষ্টভাবে নির্ধারণ করা হয়। মডিউল একে অপরের উপর নির্ভরশীল হতে পারে, এবং আপনি নির্দিষ্টভাবে বলতে পারেন কোন মডিউলটি কোন মডিউলের সাথে কাজ করবে।
Java 9 মডিউল সিস্টেমের ব্যবহার উদাহরণ:
মডিউল তৈরি করা
প্রথমে, একটি মডিউল তৈরি করার জন্য module-info.java ফাইল তৈরি করতে হয়:
// file: module-info.java
module mymodule {
requires java.base; // Import java.base module
exports com.example; // Export com.example package to the outside world
}
মডিউল ব্যবহার করা
এখন একটি অন্য মডিউল তৈরি করা এবং প্রথম মডিউলটি ব্যবহারের জন্য একটি module-info.java ফাইল তৈরি করতে হবে:
// file: module-info.java
module anothermodule {
requires mymodule; // Import mymodule
}
একটি মডিউল তৈরি এবং ব্যবহার:
- Mymodule: এটি একটি মডিউল যা
com.exampleপ্যাকেজটি এক্সপোর্ট করে এবংjava.baseমডিউলটির উপর নির্ভরশীল। - Anothermodule: এটি
mymoduleমডিউলের উপর নির্ভরশীল এবং এই মডিউলের মধ্যে থাকা ফাংশনালিটি ব্যবহার করবে।
Java 9 মডিউল সিস্টেমের সুবিধা:
- Encapsulation:
- মডিউল সিস্টেম ব্যবহার করে আপনি কোডের একাধিক অংশকে একে অপর থেকে আলাদা করে রাখতে পারেন। প্রতিটি মডিউল তার নিজস্ব প্যাকেজ এবং ক্লাসগুলির ওপর নিয়ন্ত্রণ রাখে এবং বাইরের পৃথিবীকে নির্দিষ্ট প্যাকেজ এবং ফাংশনালিটির মাধ্যমে এক্সপোজ করতে পারে।
- Reduced Dependency:
- মডিউল সিস্টেমের মাধ্যমে নির্দিষ্ট মডিউলগুলোর মধ্যে নির্ভরতাগুলি স্পষ্টভাবে ঘোষণা করা হয়, যা ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করে তোলে এবং unnecessary dependencies দূর করতে সহায়তা করে।
- Performance Optimization:
- মডিউল সিস্টেমের মাধ্যমে কোড লোডিং অনেক বেশি কাস্টমাইজড এবং নিয়ন্ত্রিত হয়, যার ফলে startup time এবং runtime performance বৃদ্ধি পায়।
- Maintainability and Scalability:
- মডিউল ব্যবহারের মাধ্যমে কোডের রক্ষণাবেক্ষণ এবং স্কেলেবিলিটি উন্নত হয়, কারণ কোড একাধিক ছোট ছোট অংশে বিভক্ত থাকে এবং কোডের পরিবর্তনগুলি একটি নির্দিষ্ট মডিউল পর্যন্ত সীমাবদ্ধ থাকে।
Java 9 এর মডিউল সিস্টেম (Jigsaw Project) Java প্ল্যাটফর্মের জন্য একটি গুরুত্বপূর্ণ উন্নয়ন যা মডুলার অ্যাপ্লিকেশন তৈরি করার জন্য একটি শক্তিশালী কাঠামো প্রদান করে। এটি কোডের স্পষ্টতা, পারফরম্যান্স, নিরাপত্তা এবং রক্ষণাবেক্ষণ সহজতর করার জন্য ব্যবহৃত হয়। Java 9-এর মডিউল সিস্টেম একটি নতুন দৃষ্টিকোণ উপস্থাপন করে যা ভবিষ্যত Java অ্যাপ্লিকেশনের উন্নয়নে সাহায্য করবে।
Java 9-এ Java Platform Module System (JPMS) নামে একটি নতুন ফিচার যোগ করা হয়, যা module এবং module layers ব্যবহার করে অ্যাপ্লিকেশন ও লাইব্রেরি ব্যবস্থাপনা সহজ করে তোলে। এই মডিউল সিস্টেম Java প্ল্যাটফর্মে কোডের সংগঠন এবং অ্যাপ্লিকেশনগুলির ডিপেনডেন্সি পরিচালনা করার জন্য ব্যবহৃত হয়। Module এবং ModuleLayer ক্লাস Java 9 থেকে java.lang প্যাকেজে অন্তর্ভুক্ত, এবং এগুলি Java অ্যাপ্লিকেশনগুলোর মডুলার কাঠামো তৈরির জন্য ব্যবহার করা হয়।
Module:
Java 9-এ Module একটি নতুন ইউনিট যা ক্লাস, প্যাকেজ এবং রিসোর্সগুলিকে একটি সুরক্ষিত এবং সংজ্ঞায়িত গ্রুপে encapsulate (encapsulate) করে। Modules Java অ্যাপ্লিকেশনের একক সত্ত্বা হিসেবে কাজ করে, এবং এটি strong encapsulation প্রদান করে যা অ্যাপ্লিকেশন এবং লাইব্রেরির ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করে।
Module এর বৈশিষ্ট্য:
- Encapsulation: Module ক্লাসের মধ্যে থাকা ডেটা এবং কার্যকলাপ (ক্লাস এবং ফাংশন) একে অপর থেকে সুরক্ষিত থাকে, এবং শুধুমাত্র নির্দিষ্ট API এর মাধ্যমে অ্যাক্সেসযোগ্য।
- Dependability: মডিউলগুলির মধ্যে ডিপেনডেন্সি স্পষ্টভাবে সংজ্ঞায়িত করা হয়, অর্থাৎ একটি মডিউল অন্য মডিউলটির উপর নির্ভরশীল থাকলে সেটা নির্দিষ্টভাবে উল্লেখ করা হয়।
- Declarative Configuration: মডিউলটি একটি
module-info.javaফাইল দ্বারা কনফিগার করা হয়, যেখানে এই মডিউলটির নাম, এর সাথে সম্পর্কিত প্যাকেজ, এবং কোন মডিউলগুলির উপর এটি নির্ভরশীল তা উল্লেখ করা হয়। - Modularity: এটি অ্যাপ্লিকেশনগুলির মধ্যে কোডের মডুলারাইজেশন এবং পুনঃব্যবহারযোগ্যতা উন্নত করে।
Module Declaration:
মডিউল সাধারণত module-info.java নামক একটি ফাইলে ঘোষণা করা হয়। এতে মডিউলটির নাম এবং এর দ্বারা প্রয়োজনীয় প্যাকেজগুলির তালিকা থাকতে পারে।
// module-info.java
module com.example.myapp {
requires java.sql; // This module requires java.sql module
exports com.example.myapp.model; // This module exports the com.example.myapp.model package
}
ব্যাখ্যা:
requires: অন্য মডিউলগুলির উপর নির্ভরশীলতা উল্লেখ করতে ব্যবহৃত হয়।exports: এই মডিউলটি কোন প্যাকেজগুলোকে বাইরের মডিউলের জন্য উপলব্ধ করবে তা ঘোষণা করে।
ModuleLayer:
ModuleLayer একটি নতুন ফিচার যা Java 9 থেকে এসেছে এবং এটি module layers তৈরি ও ব্যবস্থাপনা করতে ব্যবহৃত হয়। এটি মডিউল সিস্টেমের একটি অংশ, এবং module layer এর মধ্যে একাধিক মডিউল গ্রুপ করা যায়। ModuleLayer মূলত মডিউল লোডিং এবং তাদের সম্পর্ক নির্ধারণের জন্য ব্যবহৃত হয়।
ModuleLayer এর মূল ভূমিকা:
- Modular ClassLoader Management: ModuleLayer ক্লাস একটি মডিউল লোডার তৈরি করে, যা একাধিক মডিউল বা মডিউল গ্রুপের জন্য ক্লাস লোডিং এবং সঠিক dependency resolution পরিচালনা করে।
- Multiple Module Layers: ModuleLayer ব্যবহার করে আপনি একাধিক মডিউল লেয়ার তৈরি করতে পারেন, যেখানে প্রতিটি লেয়ার নির্দিষ্ট মডিউলগুলোকে ধারণ করবে এবং একে অপরের সাথে সম্পর্কিত থাকবে।
- Modular Layering: মডিউলগুলির মধ্যে ক্লাস লোডিং এবং পরবর্তী ব্যবস্থাপনা করার জন্য এটি ব্যবহৃত হয়। ModuleLayer মডিউলগুলির মধ্যে নির্দিষ্ট ডিপেনডেন্সি নির্ধারণ করতে সহায়তা করে।
ModuleLayer এর উদাহরণ:
import java.lang.module.*;
public class ModuleLayerExample {
public static void main(String[] args) {
try {
// Create a module layer from a module
Configuration config = ModuleFinder.ofSystem().configuration();
ModuleLayer layer = ModuleLayer.boot();
// Get a module from the layer
Module myModule = layer.findModule("com.example.myapp").orElseThrow();
// Print the module name
System.out.println("Module name: " + myModule.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- ModuleFinder: এটি মডিউল সিস্টেম থেকে মডিউলগুলি খুঁজে পেতে ব্যবহৃত হয়।
- ModuleLayer.boot(): এটি মূল সিস্টেম লেয়ার তৈরি করে।
- findModule(): এই মেথডটির মাধ্যমে নির্দিষ্ট মডিউলটি খোঁজা হয় এবং এটি ডাইনামিকভাবে মডিউল লেয়ার থেকে রিটার্ন হয়।
Module এবং ModuleLayer এর মধ্যে পার্থক্য:
| Concept | Module | ModuleLayer |
|---|---|---|
| Definition | A module is a self-contained unit of code with a name and a declaration (module-info.java). It encapsulates code and dependencies. | A module layer is a collection of modules that define how modules interact and load together. |
| Usage | Defines a module's dependencies, exported packages, and requirements. | Manages and controls how multiple modules interact and load at runtime. |
| Purpose | Organizes code, ensures modularity, and encapsulates code for better security and maintainability. | Allows for more complex modularity setups, enabling modular code loading and dependency management at runtime. |
Module এবং ModuleLayer এর সুবিধা:
- Encapsulation: কোডের অংশগুলি সুরক্ষিত থাকে, শুধুমাত্র প্রয়োজনীয় ফাংশনালিটি প্রকাশ করা হয়।
- Dependency Management: মডিউলগুলির মধ্যে ডিপেনডেন্সি স্পষ্টভাবে নিয়ন্ত্রিত হয়, ফলে কোডের নির্ভরতা এবং সম্পর্ক সহজে মানেজ করা যায়।
- Improved Performance: মডিউল সিস্টেমের মাধ্যমে আপনার অ্যাপ্লিকেশনটির পারফরম্যান্স উন্নত করা যায় কারণ এটি কোডের অংশবিশেষ লোড করা এবং নির্দিষ্ট রিসোর্স ব্যবস্থাপনা করতে সাহায্য করে।
- Simplified Maintainability: মডুলার কাঠামো কোডের রক্ষণাবেক্ষণকে সহজ করে, কারণ আপনি অ্যাপ্লিকেশনটির অংশগুলো আলাদাভাবে হ্যান্ডেল করতে পারেন।
Module এবং ModuleLayer Java 9 এর পরবর্তী সংস্করণের অন্যতম প্রধান বৈশিষ্ট্য। Modules Java অ্যাপ্লিকেশনগুলিকে আরও সুসংগঠিত ও নিরাপদভাবে তৈরি করতে সাহায্য করে, যেখানে ModuleLayer আপনার মডিউলগুলির মধ্যে সম্পর্ক নির্ধারণ এবং ক্লাস লোডিং নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয়। এগুলি Java প্ল্যাটফর্মে কোডের মডুলারাইজেশন এবং ডিপেনডেন্সি ম্যানেজমেন্টের জন্য অপরিহার্য। Module সিস্টেমের মাধ্যমে Java আরও শক্তিশালী, পারফরম্যান্স-বান্ধব এবং রক্ষণাবেক্ষণযোগ্য হয়ে উঠেছে।
Modules এবং ModuleLayer Java 9-এ Java Platform Module System (JPMS) এর অংশ হিসেবে অন্তর্ভুক্ত করা হয়েছে। এটি Java অ্যাপ্লিকেশনগুলির মধ্যে একটি মডুলার আর্কিটেকচার প্রবর্তন করে এবং একটি অ্যাপ্লিকেশনের বিভিন্ন অংশগুলিকে আলাদা মডিউলে বিভক্ত করার জন্য সহায়তা করে। মডিউল ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনের কম্পোনেন্টগুলোকে আরও সুসংগঠিত এবং ব্যবস্থাপনা সহজ করতে পারেন।
Module System এর ভূমিকা:
Java 9 থেকে Java Platform Module System (JPMS) পরিচিত হয়েছে, যার মাধ্যমে একটি নতুন মডুলার আর্কিটেকচার তৈরি করা হয়েছে যা আপনার Java অ্যাপ্লিকেশনকে ছোট, পুনঃব্যবহারযোগ্য এবং আংশিকভাবে পৃথক মডিউলে ভাগ করতে সাহায্য করে। এটি অ্যাপ্লিকেশনগুলির নির্ভরতাগুলি স্পষ্টভাবে ডিফাইন করার পাশাপাশি, অ্যাপ্লিকেশনের নিরাপত্তা এবং পারফরম্যান্স বৃদ্ধি করে।
Module এবং ModuleLayer এর ভূমিকা:
- Module:
- Module হল একটি ইউনিট যা ক্লাস, প্যাকেজ, এবং সংস্থানগুলো ধারণ করে এবং এর মধ্যে নির্দিষ্ট অ্যাক্সেস কন্ট্রোল থাকে।
- একটি module ক্লাস, প্যাকেজ, রিসোর্স, এবং অন্যান্য মডিউলগুলির মধ্যে নির্ভরতাগুলি নির্দিষ্ট করে।
- মডিউল একটি module-info.java ফাইলের মাধ্যমে ঘোষণা করা হয়, যেখানে মডিউলের নাম এবং এর নির্ভরতা সম্পর্কে তথ্য থাকে।
- ModuleLayer:
- ModuleLayer হল একটি নতুন কনসেপ্ট Java 9 এর পরে, যা মডিউলগুলোকে logical layers-এ বিভক্ত করে।
- এটি module graph তৈরি করে, যা মডিউলগুলোর মধ্যে সম্পর্ক নির্ধারণ করে।
- ModuleLayer মডিউলগুলোর একত্রিত হওয়ার প্রক্রিয়াকে নিয়ন্ত্রণ করে, মডিউলগুলোর মধ্যে নির্ভরতা পরীক্ষা করে এবং মডিউললোডিং এর সময় নির্ধারণ করে।
Module তৈরি এবং ম্যানেজমেন্ট:
Java 9-এ মডিউল তৈরি এবং ম্যানেজমেন্টের জন্য module-info.java ফাইল ব্যবহার করা হয়। এটি একটি বিশেষ ধরনের ফাইল যা মডিউলের নাম, তার নির্ভরতাগুলি, এবং এক্সপোর্ট করা প্যাকেজগুলির তালিকা নির্ধারণ করে।
Module তৈরি করার ধাপ:
- Module Declaration (module-info.java):
- মডিউল তৈরি করতে প্রথমে module-info.java ফাইল তৈরি করতে হয়, যেখানে মডিউল সম্পর্কিত তথ্য নির্ধারণ করা হয়।
module-info.java ফাইলের উদাহরণ:
// module-info.java
module my.module {
requires java.base; // Dependency on java.base module
exports com.myapp; // Export the package com.myapp
}
ব্যাখ্যা:
module my.module {}: এটি একটি মডিউল ডিক্লেয়ারেশন, যেখানেmy.moduleহল মডিউলের নাম।requires: এটি নির্দেশ করে যে এই মডিউলটি অন্য কোনো মডিউল (যেমনjava.base) এর উপর নির্ভরশীল।exports: এটি মডিউলের প্যাকেজগুলিকে অ্যাক্সেসযোগ্য করে তোলে। শুধুমাত্র যেই প্যাকেজগুলোexportsকরা হয়, সেই প্যাকেজগুলো অন্য মডিউল থেকে অ্যাক্সেস করা যাবে।
- Module Definition:
- মডিউল তৈরি হওয়ার পর, আপনি তার প্যাকেজ এবং ক্লাসগুলোকে ব্যবহার করে কোড লিখতে পারেন। মডিউল এবং এর প্যাকেজগুলির মধ্যে নির্ভরতাগুলি
module-info.javaফাইলে ডিফাইন করা থাকবে।
- মডিউল তৈরি হওয়ার পর, আপনি তার প্যাকেজ এবং ক্লাসগুলোকে ব্যবহার করে কোড লিখতে পারেন। মডিউল এবং এর প্যাকেজগুলির মধ্যে নির্ভরতাগুলি
Compiling the Module:
- মডিউলটি কম্পাইল করতে, আপনি javac কমান্ড ব্যবহার করতে পারেন এবং
module-info.javaফাইলটিকে আপনার কোডের সাথে একত্রিত করতে হবে।
উদাহরণ:
javac -d mods/my.module my/module/com/myapp/*.java my/module/module-info.java- মডিউলটি কম্পাইল করতে, আপনি javac কমান্ড ব্যবহার করতে পারেন এবং
Running the Module:
- মডিউল রান করার জন্য java কমান্ড ব্যবহার করতে হবে এবং মডিউলের ক্লাসপাথ সেট করতে হবে।
উদাহরণ:
java --module-path mods -m my.module/com.myapp.MainClass
ModuleLayer এর ব্যবহার:
ModuleLayer মডিউলগুলোর মধ্যে সম্পর্ক ব্যবস্থাপনা এবং তাদের লোডিং নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয়। এটি মূলত মডিউলগুলোর মধ্যে লোডিং এবং এক্সিকিউশনের জন্য একটি লজিক্যাল লেয়ার তৈরি করে।
ModuleLayer উদাহরণ:
import java.lang.module.ModuleLayer;
import java.lang.module.ModuleFinder;
import java.nio.file.Paths;
public class ModuleLayerExample {
public static void main(String[] args) {
// ModuleFinder used to locate modules in the directory
ModuleFinder finder = ModuleFinder.of(Paths.get("path/to/modules"));
// Create the module layer
ModuleLayer layer = ModuleLayer.boot(); // Load the boot layer (default system modules)
// Optionally, add custom layers if needed
ModuleLayer.Controller controller = ModuleLayer.defineModulesWithOneLoader(
finder, ClassLoader.getSystemClassLoader()
);
// Displaying modules in the layer
layer.modules().forEach(module -> System.out.println(module.getName()));
}
}
ব্যাখ্যা:
ModuleFinderমডিউল লোডারের সাথে ব্যবহৃত হয়, যাতে আপনি মডিউলগুলি একটি নির্দিষ্ট ডিরেক্টরি থেকে খুঁজে পেতে পারেন।ModuleLayer.boot()মেথড ব্যবহার করে ডিফল্ট মডিউল লেয়ার তৈরি করা হয়, যা সিস্টেম মডিউলস অন্তর্ভুক্ত করে।ModuleLayer.defineModulesWithOneLoader()মেথড ব্যবহার করে আপনি নিজের কাস্টম মডিউল লেয়ার তৈরি করতে পারেন।
Module System এর সুবিধা:
- Encapsulation:
- মডিউল সিস্টেমের মাধ্যমে অ্যাপ্লিকেশনগুলির ভেতরের বাস্তবায়ন লুকানো যায়, শুধুমাত্র প্রয়োজনীয় অংশগুলি এক্সপোজ করা হয়।
- Reliability:
- মডিউল সিস্টেম আপনাকে নির্ভরতাগুলি স্পষ্টভাবে ডিফাইন করতে সহায়তা করে, ফলে কোডের এক্সপ্লোরেশন এবং ডিপেনডেন্সি চেকিং সহজ হয়ে যায়।
- Maintainability:
- বড় অ্যাপ্লিকেশনগুলিতে কোডের পৃথক অংশগুলো মডিউলে ভাগ করে রাখা যায়, যা মেইন্টেনেন্স সহজ করে এবং ডেভেলপমেন্টে দ্রুততা আনে।
- Security:
- মডিউল সিস্টেম নিরাপত্তা বৃদ্ধির জন্য প্রতিটি মডিউলে নির্দিষ্ট অ্যাক্সেস কন্ট্রোল প্রদান করে।
- Performance:
- মডিউল সিস্টেম দ্বারা আপনি কোডের নির্দিষ্ট অংশগুলো শুধুমাত্র যখন প্রয়োজন হয় তখনই লোড করতে পারেন, ফলে পারফরম্যান্স বাড়ে।
Java Modules এবং ModuleLayer Java 9 থেকে একটি নতুন ক্ষমতা হিসেবে এসেছে, যা Java অ্যাপ্লিকেশনগুলির উন্নয়ন এবং ব্যবস্থাপনায় শক্তিশালী ভূমিকা রাখে। মডিউল সিস্টেমের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনটি ছোট, পুনঃব্যবহারযোগ্য, এবং সুসংগঠিত রাখতে পারেন। এটি নিরাপত্তা, পারফরম্যান্স এবং মেইন্টেন্যান্সের জন্যও অনেক সুবিধা প্রদান করে। module-info.java ফাইলের মাধ্যমে মডিউল তৈরি এবং ম্যানেজমেন্ট করা যায়, যা অ্যাপ্লিকেশন ডেভেলপমেন্টকে আরও সুসংগঠিত ও সুরক্ষিত করে।
Java 9 এ Modules সিস্টেম (JPMS - Java Platform Module System) চালু করার মাধ্যমে Java-তে modules এর ধারণা আসছে। Modules হলো একটি নতুন ফিচার যা কোডের সংগঠন এবং ইন্সটলেশন সুবিধা প্রদান করে। এটি প্রোগ্রামের মডুলারাইজেশন এবং সিকিউরিটি বৃদ্ধি করার জন্য ব্যবহৃত হয়। ClassLoader Java-র একটি পুরোনো ধারণা, যা ক্লাস লোডিং এবং ডাইনামিক ক্লাস রেজল্যুশন পরিচালনা করে।
এই দুইটি (Modules এবং ClassLoader) একে অপরের সাথে সংযুক্ত। ক্লাস লোডার Modules এর অন্তর্গত ক্লাসগুলি লোড করতে ব্যবহৃত হয়, এবং Modules একটি ক্লাসের লোডিং প্রক্রিয়াকে প্রভাবিত করতে পারে।
1. Module System (JPMS)
Java Platform Module System (JPMS) হল একটি মডুলার আর্কিটেকচার যা Java 9-এ পরিচিত হয়। এটি কোডের একাধিক অংশকে একত্রে একটি মডিউলে সংগঠিত করতে সহায়তা করে এবং মডিউলগুলির মধ্যে নির্ভরতাগুলি ঘোষণা করা হয়।
Module System-এর মূল ধারণা:
- Module: একটি
moduleহল একটি গোষ্ঠী বা প্যাকেজ যা এক বা একাধিক ক্লাস, ইন্টারফেস, কন্সট্যান্ট, এবং রিসোর্স ধারণ করতে পারে। একটি মডিউল একটিmodule-info.javaফাইলের মাধ্যমে সংজ্ঞায়িত করা হয়। - Exports: আপনি কোন প্যাকেজ বা ক্লাস মডিউলের বাইরের ক্লাসের জন্য উপলব্ধ করতে চান, তা
exportsকিওয়ার্ডের মাধ্যমে নির্ধারণ করেন। - Requires: একটি মডিউল কোন অন্য মডিউলটি ব্যবহার করবে তা
requiresকিওয়ার্ডের মাধ্যমে নির্ধারণ করা হয়।
Example of module-info.java:
module mymodule {
exports com.myapp.utils;
requires java.base;
}
এখানে, mymodule মডিউল com.myapp.utils প্যাকেজটি বাইরের ব্যবহারকারীদের জন্য উন্মুক্ত করছে এবং java.base মডিউলের উপর নির্ভরশীল।
2. ClassLoader:
ClassLoader হল Java-র একটি ফিচার যা JVM (Java Virtual Machine) কে ক্লাস লোড করার জন্য দায়িত্বশীল। এটি একটি ক্লাস বা রিসোর্স সিস্টেমের মধ্যে থেকে লোড করে এবং ক্লাস ব্যবহারের জন্য প্রস্তুত করে।
ClassLoader এর কাজ:
- Dynamic Loading: যখন কোনও ক্লাস প্রথমবার ব্যবহৃত হয়, তখন ক্লাস লোডার সেই ক্লাসটি লোড করে।
- Classpath Searching: ক্লাস লোডার
classpathবাmodule path(যখন মডিউল সিস্টেম ব্যবহৃত হয়) এর মধ্যে খোঁজে ক্লাস খুঁজে বের করে। - Delegation Model: Java-তে ক্লাস লোডার সাধারণত একটি delegation model অনুসরণ করে, যেখানে একটি ক্লাস লোডার প্রথমে পিতামাতার ক্লাস লোডারে ক্লাস লোড করতে পাঠায়।
Types of ClassLoaders:
- Bootstrap ClassLoader: এটি JVM-এর অন্তর্গত, যা Java এর বেসিক ক্লাস (যেমন
java.lang.*ক্লাস) লোড করে। - Extension ClassLoader: এটি JRE-র lib/ext ডিরেক্টরি থেকে ক্লাস লোড করে।
- System ClassLoader: এটি ক্লাসপাথ থেকে ক্লাস লোড করে, যা অ্যাপ্লিকেশন বা ব্যবহারকারীর নির্দিষ্ট পাথ হয়।
Modules এবং ClassLoader এর মধ্যে সম্পর্ক:
Java 9 থেকে Modules সিস্টেমের সাথে ClassLoader এর সম্পর্ক পরিবর্তিত হয়েছে, কারণ মডিউল সিস্টেমের মাধ্যমে ক্লাস লোডিং প্রক্রিয়া আরও কন্ট্রোলড এবং সিকিউর করা হয়েছে।
Relationship between Modules and ClassLoader:
- Module Path vs Class Path:
- যখন Modules সিস্টেম চালু হয়, তখন module path এবং classpath আলাদা হয়ে যায়। ক্লাস লোডারের মাধ্যমে ক্লাসগুলি classpath থেকে লোড করার পাশাপাশি মডিউল সিস্টেমের ক্লাস লোডিং এখন module path থেকে হয়।
- মডিউল লোডিং এবং ক্লাস লোডিং আলাদা, তবে ClassLoader মডিউল থেকে ক্লাস লোড করার জন্য বিশেষভাবে কনফিগার করা হয়।
- Module Specific ClassLoader:
- একটি মডিউলটির নিজস্ব ClassLoader থাকতে পারে। যখন একটি মডিউল নির্দিষ্ট ক্লাস বা ফাইল লোড করতে চায়, তখন এটি একটি custom ClassLoader ব্যবহার করতে পারে। ক্লাস লোডার সেই মডিউল থেকে ক্লাস বা রিসোর্স লোড করবে এবং মডিউল ডিপেনডেন্সি চেক করবে।
- Access Control Between Modules:
- মডিউল সিস্টেম ক্লাসের এক্সেস কন্ট্রোলের একটি নতুন স্তর যোগ করেছে। একটি মডিউল যদি একটি ক্লাস export করে, তাহলে অন্য মডিউল সেই ক্লাসের অ্যাক্সেস করতে পারবে, অন্যথায় পারবে না। এই পদ্ধতি ক্লাস লোডারের মাধ্যমে নিয়ন্ত্রণ করা হয়, যেহেতু ক্লাস লোডার নির্দিষ্ট মডিউল থেকে ক্লাস লোড করবে এবং এক্সেস কন্ট্রোল পরিচালনা করবে।
- Module ClassLoader and Delegation:
- যখন একটি ক্লাস লোডার মডিউলটি লোড করে, তখন এটি delegation model অনুসরণ করতে পারে। এটি একটি ক্লাস লোডারকে মডিউল থেকে ক্লাস লোড করার সময়, তার পিতামাতার ক্লাস লোডারের কাছে ক্লাস লোড করার জন্য পাঠায়। ফলে, মডিউল ক্লাস লোডার modules এবং class loading প্রক্রিয়া সংযুক্ত করতে ব্যবহৃত হয়।
Example: ClassLoader and Modules Interaction
Scenario:
Suppose you have a module that depends on another module, and you need to load classes dynamically from these modules.
// Define a module (module-info.java)
module myModule {
requires java.base;
exports com.mycompany.mypackage;
}
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class DynamicClassLoading {
public static void main(String[] args) throws Exception {
// Load a class dynamically from a module
URL[] urls = {new URL("file:/path/to/your/module.jar")};
URLClassLoader classLoader = new URLClassLoader(urls);
Class<?> clazz = classLoader.loadClass("com.mycompany.mypackage.MyClass");
// Dynamically invoke a method from the loaded class
Method method = clazz.getMethod("myMethod");
method.invoke(clazz.getDeclaredConstructor().newInstance());
}
}
Explanation:
- Module: The module
myModulehas dependencies on thejava.basemodule and exports thecom.mycompany.mypackagepackage. - ClassLoader: The
URLClassLoaderis used to dynamically load classes from the module (or JAR). - Method Invocation: Reflection is used to dynamically invoke a method of the loaded class.
This demonstrates how a ClassLoader and Modules work together to load and interact with classes at runtime in Java.
- ClassLoader এবং Modules Java-তে একে অপরের সাথে নিবিড়ভাবে সম্পর্কিত। Modules সিস্টেম ক্লাস লোডিংকে আরও সুরক্ষিত এবং কন্ট্রোলড করে তোলে, যেখানে ClassLoader নির্দিষ্ট মডিউল থেকে ক্লাস লোড করতে ব্যবহৃত হয়।
- মডিউল সিস্টেম Java-তে নির্দিষ্টভাবে ক্লাস লোডিংয়ের পদ্ধতিকে নিয়ন্ত্রণ করতে সাহায্য করে, এবং Module ClassLoader মডিউলের মধ্যে ক্লাস এবং রিসোর্স অ্যাক্সেসের নিরাপত্তা এবং এক্সেস কন্ট্রোল পরিচালনা করে।
- এর মাধ্যমে কোডের নিরাপত্তা, পারফরম্যান্স এবং সিস্টেমের সহজ ব্যবস্থাপনা নিশ্চিত করা সম্ভব হয়।
Read more